home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / DELPHI / EZDSL200.ZIP / DTSTSTAK.DPR < prev    next >
Encoding:
Text File  |  1996-03-13  |  8.1 KB  |  278 lines

  1. program DTstStak;
  2.   {-Test program for stacks, queues, deques, and priority queues}
  3.  
  4. {$I EZDSLDEF.INC}
  5. {---Place any compiler options you require here-----------------------}
  6.  
  7.  
  8. {---------------------------------------------------------------------}
  9. {$I EZDSLOPT.INC}
  10.  
  11. {$IFDEF Win32}
  12. {$APPTYPE CONSOLE}
  13. {$ENDIF}
  14.  
  15. uses
  16.   {$IFDEF Win32}
  17.   Windows,
  18.   {$ELSE}
  19.   WinProcs,
  20.   WinTypes,
  21.   {$ENDIF}
  22.   SysUtils,
  23.   EZDSLCts in 'EZDSLCTS.PAS',
  24.   EZDSLBse in 'EZDSLBSE.PAS',
  25.   EZDSLStk in 'EZDSLSTK.PAS',
  26.   EZDSLQue in 'EZDSLQUE.PAS',
  27.   EZDSLPqu in 'EZDSLPQU.PAS',
  28.   EZDSLSup in 'EZDSLSUP.PAS',
  29.   DTstGen in 'DTstGen.pas';
  30.  
  31. function ReverseCompare(Data1, Data2 : pointer) : integer; far;
  32.   begin
  33.     Result := EZStrCompare(Data2, Data1);
  34.   end;
  35.  
  36. var
  37.   Stack, NewStack : TStack;
  38.   Queue, NewQueue : TQueue;
  39.   DeQue, NewDeQue : TDeQue;
  40.   PrQueue, NewPrQueue : TPriorityQueue;
  41.   i : integer;
  42.   S : PEZString;
  43.   SavedS : string;
  44.  
  45. begin
  46.   OpenLog;
  47.   try
  48.     WriteLog('Starting tests');
  49.  
  50.     WriteLog('----------------STACK----------------');
  51.     Stack := nil;
  52.     try
  53.       WriteLog('First test: push and pop');
  54.       Stack := TStack.Create(true);
  55.       with Stack do
  56.         begin
  57.           Compare := EZStrCompare;
  58.           DupData := EZStrDupData;
  59.           DisposeData := EZStrDisposeData;
  60.           WriteLog('...pushing names of numbers');
  61.           for i := 1 to 10 do
  62.             Push(EZStrNew(NumToName(i)));
  63.           WriteLog('...popping them (should read ten..one)');
  64.           while not IsEmpty do
  65.             begin
  66.               S := PEZString(Pop);
  67.               WriteLog(S^);
  68.               EZStrDispose(S);
  69.             end;
  70.           WriteLog('...end of test 1');
  71.         end;
  72.  
  73.       WriteLog('Second test: clone');
  74.       with Stack do
  75.         begin
  76.           WriteLog('...pushing names of numbers');
  77.           for i := 1 to 10 do
  78.             Push(EZStrNew(NumToName(i)));
  79.           WriteLog('...creating clone');
  80.           NewStack := TStack.Clone(Stack, true, Compare);
  81.           try
  82.             WriteLog('...popping 1st five strings from new stack');
  83.             WriteLog('...(should read ten..six)');
  84.             for i := 1 to 5 do
  85.               begin
  86.                 S := PEZString(NewStack.Pop);
  87.                 WriteLog(S^);
  88.                 EZStrDispose(S);
  89.               end;
  90.           finally
  91.             NewStack.Free;
  92.           end;{try..finally}
  93.           WriteLog('...end of test 2');
  94.         end;
  95.     finally
  96.       Stack.Free;
  97.     end;
  98.  
  99.     WriteLog('----------------QUEUE----------------');
  100.     Queue := nil;
  101.     try
  102.       WriteLog('First test: append and pop');
  103.       Queue := TQueue.Create(true);
  104.       with Queue do
  105.         begin
  106.           Compare := EZStrCompare;
  107.           DupData := EZStrDupData;
  108.           DisposeData := EZStrDisposeData;
  109.           WriteLog('...appending names of numbers');
  110.           for i := 1 to 10 do
  111.             Append(EZStrNew(NumToName(i)));
  112.           WriteLog('...popping them (should read one..ten)');
  113.           while not IsEmpty do
  114.             begin
  115.               S := PEZString(Pop);
  116.               WriteLog(S^);
  117.               EZStrDispose(S);
  118.             end;
  119.           WriteLog('...end of test 1');
  120.         end;
  121.  
  122.       WriteLog('Second test: clone');
  123.       with Queue do
  124.         begin
  125.           WriteLog('...appending names of numbers');
  126.           for i := 1 to 10 do
  127.             Append(EZStrNew(NumToName(i)));
  128.           WriteLog('...creating clone');
  129.           NewQueue := TQueue.Clone(Queue, true, Compare);
  130.           try
  131.             WriteLog('...popping 1st five strings from new queue');
  132.             WriteLog('...(should read one..five)');
  133.             for i := 1 to 5 do
  134.               begin
  135.                 S := PEZString(NewQueue.Pop);
  136.                 WriteLog(S^);
  137.                 EZStrDispose(S);
  138.               end;
  139.           finally
  140.             NewQueue.Free;
  141.           end;{try..finally}
  142.           WriteLog('...end of test 2');
  143.         end;
  144.     finally
  145.       Queue.Free;
  146.     end;
  147.  
  148.     WriteLog('----------------DEQUE----------------');
  149.     Deque := nil;
  150.     try
  151.       WriteLog('First test: push/append and pop');
  152.       Deque := TDeque.Create(true);
  153.       with Deque do
  154.         begin
  155.           Compare := EZStrCompare;
  156.           DupData := EZStrDupData;
  157.           DisposeData := EZStrDisposeData;
  158.           WriteLog('...appending 1st 5 names of numbers');
  159.           for i := 1 to 5 do
  160.             Append(EZStrNew(NumToName(i)));
  161.           WriteLog('...pushing 2nd 5 names of numbers');
  162.           for i := 6 to 10 do
  163.             Push(EZStrNew(NumToName(i)));
  164.           WriteLog('...popping them (should read ten..six,one..five)');
  165.           while not IsEmpty do
  166.             begin
  167.               S := PEZString(Pop);
  168.               WriteLog(S^);
  169.               EZStrDispose(S);
  170.             end;
  171.           WriteLog('...end of test 1');
  172.         end;
  173.  
  174.       WriteLog('Second test: clone');
  175.       with Deque do
  176.         begin
  177.           WriteLog('...appending 1st 5 names of numbers');
  178.           for i := 1 to 5 do
  179.             Append(EZStrNew(NumToName(i)));
  180.           WriteLog('...pushing 2nd 5 names of numbers');
  181.           for i := 6 to 10 do
  182.             Push(EZStrNew(NumToName(i)));
  183.           WriteLog('...creating clone');
  184.           NewDeque := TDeque.Clone(Deque, true, Compare);
  185.           try
  186.             WriteLog('...popping 1st six strings from new deque');
  187.             WriteLog('...(should read ten..six,one)');
  188.             for i := 1 to 6 do
  189.               begin
  190.                 S := PEZString(NewDeque.Pop);
  191.                 WriteLog(S^);
  192.                 EZStrDispose(S);
  193.               end;
  194.           finally
  195.             NewDeque.Free;
  196.           end;{try..finally}
  197.           WriteLog('...end of test 2');
  198.         end;
  199.     finally
  200.       Deque.Free;
  201.     end;
  202.  
  203.     WriteLog('----------------PRIORITY QUEUE----------------');
  204.     PrQueue := nil;
  205.     try
  206.       WriteLog('First test: append and pop');
  207.       PrQueue := TPriorityQueue.Create(true);
  208.       with PrQueue do
  209.         begin
  210.           Compare := EZStrCompare;
  211.           DupData := EZStrDupData;
  212.           DisposeData := EZStrDisposeData;
  213.           WriteLog('...appending names of numbers');
  214.           for i := 1 to 10 do
  215.             Append(EZStrNew(NumToName(i)));
  216.           WriteLog('...popping them');
  217.           WriteLog('...(should read eight,five,four,nine,one,seven,six,ten,three,two)');
  218.           while not IsEmpty do
  219.             begin
  220.               S := PEZString(Pop);
  221.               WriteLog(S^);
  222.               EZStrDispose(S);
  223.             end;
  224.           WriteLog('...end of test 1');
  225.         end;
  226.  
  227.       WriteLog('Second test: clone');
  228.       with PrQueue do
  229.         begin
  230.           WriteLog('...appending names of numbers');
  231.           for i := 1 to 10 do
  232.             Append(EZStrNew(NumToName(i)));
  233.           WriteLog('...creating clone (but descending order)');
  234.           NewPrQueue := TPriorityQueue.Clone(PrQueue, true, ReverseCompare);
  235.           try
  236.             WriteLog('...popping 1st five strings from new queue');
  237.             WriteLog('...(should read two,three,ten,six,seven)');
  238.             for i := 1 to 5 do
  239.               begin
  240.                 S := PEZString(NewPrQueue.Pop);
  241.                 WriteLog(S^);
  242.                 EZStrDispose(S);
  243.               end;
  244.           finally
  245.             NewPrQueue.Free;
  246.           end;{try..finally}
  247.           WriteLog('...end of test 2');
  248.         end;
  249.  
  250.       WriteLog('Third test: megatest');
  251.       with PrQueue do
  252.         begin
  253.           WriteLog('...appending 30,000 random strings');
  254.           for i := 1 to 30000 do
  255.             begin
  256.               SavedS := RandomStr(10+Random(15));
  257.               Append(EZStrNew(SavedS));
  258.             end;
  259.           WriteLog('...popping strings, checking sequence');
  260.           SavedS := '';
  261.           while not IsEmpty do
  262.             begin
  263.               S := PEZString(Pop);
  264.               if (SavedS > S^) then
  265.                 WriteLog('sequence error');
  266.               SavedS := S^;
  267.               EZStrDispose(S);
  268.             end;
  269.           WriteLog('...end of test 3');
  270.         end;
  271.     finally
  272.       PrQueue.Free;
  273.     end;
  274.   finally
  275.     CloseLog;
  276.   end;
  277. end.
  278.